package com.zkt.club.gateway.exception;

import cn.dev33.satoken.exception.SaTokenException;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.zkt.club.gateway.entity.Result;
import org.springframework.boot.web.reactive.error.ErrorWebExceptionHandler;
import org.springframework.core.io.buffer.DataBufferFactory;
import org.springframework.http.MediaType;
import org.springframework.http.server.reactive.ServerHttpRequest;
import org.springframework.http.server.reactive.ServerHttpResponse;
import org.springframework.stereotype.Component;
import org.springframework.web.server.ServerWebExchange;
import reactor.core.publisher.Mono;

/**
 * @author 赵开泰
 * @program jc-club
 * @date 2025/3/21 22:52
 * @description 网关全局异常处理
 **/

@Component
public class GatewayExceptionHandler implements ErrorWebExceptionHandler {
	
	private ObjectMapper objectMapper = new ObjectMapper();
	
	@Override
	public Mono<Void> handle(ServerWebExchange exchange, Throwable ex) {
		ServerHttpRequest request = exchange.getRequest();
		ServerHttpResponse response = exchange.getResponse();
		Integer code = 200;
		String message = "";
		
		if (ex instanceof SaTokenException) {
			code = 401;
			message = "用户无权限";
		} else {
			code = 500;
			message = "系统繁忙";
		}
		
		Result result = Result.fail(code, message);
		response.getHeaders().setContentType(MediaType.APPLICATION_JSON);
		
		return response.writeWith(Mono.fromSupplier(() -> {
			DataBufferFactory dataBufferFactory = response.bufferFactory();
			byte[] bytes = null;
			try {
				bytes = objectMapper.writeValueAsBytes(result);
			} catch (JsonProcessingException e) {
				e.printStackTrace();
			}
			return dataBufferFactory.wrap(bytes);
		}));
	}
}